package com.tdam2011.grupo05.com;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;

import android.util.Log;
import android.util.Xml;

import com.tdam2011.grupo05.entidades.Contacto;
import com.tdam2011.grupo05.entidades.Mensaje;

public class MensajeParser {

	public static final String RESULT = "result";
	public static final String USER = "user";
	public static final String DETAIL = "detail";
	public static final String MESSAGELIST = "message-list";
	public static final String MESSAGE = "message";

	public static final String SUCCESS_RESULT = "success";
	public static final String ERROR_RESULT = "error";
	

	private ArrayList<Mensajes> mensajes;

	private Respuesta respuesta;
	private Usuario usuario;
	private Detalle detalle;
	private StringReader read;

	private int id;

	private StringEntity se;
	private Calendar calendar;
	private Date date;
	
	
	
	
	public MensajeParser() {
		
	}

	public void httpRequest(final StringEntity se) {

		// new Thread() {
		// public void run() {
		try {

			HttpClient client = new DefaultHttpClient();
			String url = "http://10.0.2.2:8080/MessageSender/";
			HttpPost post = new HttpPost(url);
			post.setEntity(se);

			HttpResponse response = client.execute(post);
			HttpEntity entity = response.getEntity();

			if (entity != null) {
				InputStream in = response.getEntity().getContent();
				BufferedReader reader = new BufferedReader(
						new InputStreamReader(in));
				String resultado = null;

				while ((resultado = reader.readLine()) != null) {

					if (!(resultado
							.equals("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"))) {
						read = new StringReader(resultado);
						parse();

						Log.i("HTTP_REQUEST", resultado);
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			Log.e("HTTP POST", e.getMessage());
		}

		// };
		// }.start();

	}

	public void enviarMensaje(Mensaje mensaje, String usuario, String password)
			throws UnsupportedEncodingException {
		id = (int) (Math.random() * 100);
		SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		calendar = Calendar.getInstance();
		calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND));
		String timestamp = formatter.format(calendar.getTime());
		Log.i("ENVIO", timestamp);
	
		
		
		se = new StringEntity("" +
				"<action id=\"REQUEST_RANDOM_VALUE\" name=\"send-message\">" +
				"<action-detail>" +
				"<auth username=\""+usuario+"\" key=\""+password+"\">" +
				"</auth><message to=\""+mensaje.getReceptor().getUsuario()+"\"><![CDATA[ "+mensaje.getMensaje()+"]]>" +
				"</message></action-detail></action>", HTTP.UTF_8);
		se.setContentType("text/xml");

		httpRequest(se);

	}

	public void consultarMensaje(String usuario, String password)
			throws UnsupportedEncodingException {
		id = (int) (Math.random() * 100);

		SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		calendar = Calendar.getInstance();
		calendar.set(Calendar.SECOND, calendar.get(Calendar.SECOND) - 3);
		calendar.set(Calendar.MILLISECOND, calendar.get(Calendar.MILLISECOND) - 500);
		String timestamp = formatter.format(calendar.getTime());
		Log.i("CONSULTA", timestamp);

		se = new StringEntity("<action id=\"REQUEST_RANDOM_VALUE" 
				+ "\" name=\"get-messages\">" + "<action-detail>"
				+ "<auth username=\"" + usuario + "\" key=\"" + password
				+ "\">" + "</auth>" + "<filter type=\"timestamp\">" + ""
				+ timestamp + "" + "</filter>" + "</action-detail>"
				+ "</action>", HTTP.UTF_8);
		se.setContentType("text/xml");

		httpRequest(se);

	}

	public void registrarUsuario(String nombre, String pass)
			throws UnsupportedEncodingException {
		id = (int) (Math.random() * 100);

		se = new StringEntity("<action id=\"" + id
				+ "\" name=\"register-user\">" + "<action-detail>"
				+ "<user username=\"" + nombre + "\" password=\"" + pass
				+ "\"/>" + "</action-detail></action>", HTTP.UTF_8);
		se.setContentType("text/xml");

		httpRequest(se);
	}

	public Object respuesta() {

		if (respuesta.tipo.equalsIgnoreCase(SUCCESS_RESULT)) {

			if (respuesta.mensajes != null && !respuesta.mensajes.isEmpty()) {

				Mensaje mensaje = new Mensaje();
				mensaje.setFecha(((Mensajes)respuesta.mensajes.get(0)).tiempo);
				
				/**
				 * una negrada
				 */
				Contacto contacto = new Contacto();
				String c = respuesta.mensajes.get(0).emisor;
				contacto.setNombre(c);

				mensaje.setReceptor(contacto);
				mensaje.setMensaje(respuesta.mensajes.get(0).mensaje);
				mensaje.setTipoMensaje(Mensaje.TIPO_MENSAJE_ENTRANTE);
				mensaje.setEstado(true);
				return mensaje;
				

			} else {
				return SUCCESS_RESULT;
			}

		}

		if (respuesta.tipo.equalsIgnoreCase(ERROR_RESULT)) {
			if (respuesta.detalle != null) {
				String detalle = respuesta.detalle.descripcion;
				if (respuesta.detalle.descripcion != null)
					Log.i("ProcesarMensaje", detalle);
				return ERROR_RESULT;
			}
		}
		return "";
	}

	public void parse() {
		Mensajes mensaje = null;

		try {

			XmlPullParserFactory parserFactory = XmlPullParserFactory
					.newInstance();

			XmlPullParser parser = parserFactory.newPullParser();

			parser.setInput(read);

			int evento = parser.getEventType();

			while (evento != XmlPullParser.END_DOCUMENT) {
				String nodo;

				switch (evento) {

				case XmlPullParser.START_DOCUMENT:
					mensajes = new ArrayList<Mensajes>();
					
					respuesta = new Respuesta();
					respuesta.mensajes = mensajes;
					usuario = new Usuario();
					detalle = new Detalle();
					mensaje = new Mensajes();
					break;

				case XmlPullParser.START_TAG:
					nodo = parser.getName();

					if (nodo.equalsIgnoreCase(RESULT)) {

						for (int i = 0; i < parser.getAttributeCount(); i++) {
							String atributo = parser.getAttributeName(i);

							if (atributo.equalsIgnoreCase("id")) {
								////respuesta.id = Integer.parseInt(parser
									//	.getAttributeValue(i));
							}

							if (atributo.equalsIgnoreCase("type")) {
								respuesta.tipo = parser.getAttributeValue(i);
							}
						}

					}

					if (nodo.equals(USER)) {

						for (int i = 0; i < parser.getAttributeCount(); i++) {
							String atributo = parser.getAttributeName(i);

							if (atributo.equalsIgnoreCase("username")) {
								usuario.nombre = parser.getAttributeValue(i);
							}

						}

						respuesta.usuario = usuario;
					}

					if (nodo.equalsIgnoreCase(DETAIL)) {

						for (int i = 0; i < parser.getAttributeCount(); i++) {
							String atributo = parser.getAttributeName(i);

							if (atributo.equalsIgnoreCase("code")) {
								detalle.codigo = Integer.parseInt(parser
										.getAttributeValue(i));

							}
							if (atributo.equalsIgnoreCase("description")) {
								detalle.descripcion = parser
										.getAttributeValue(i);
							}

						}
						respuesta.detalle = detalle;
					}

					if (nodo.equalsIgnoreCase(MESSAGELIST)) {
						//respuesta.mensajes = mensajes;
					}
					if (nodo.equalsIgnoreCase(MESSAGE)) {
						 

						for (int i = 0; i < parser.getAttributeCount(); i++) {
							String atributo = parser.getAttributeName(i);

							if (atributo.equalsIgnoreCase("from")) {
								mensaje.emisor = parser.getAttributeValue(i);

							}

							if (atributo.equalsIgnoreCase("timestamp")) {
								mensaje.tiempo = parser.getAttributeValue(i);
							}
						}

						
					}
			

					break;
					
				case XmlPullParser.CDSECT:
					Log.i("CDATA", "en el CDSECT");

					mensaje.mensaje = parser.getText();
					respuesta.mensajes.add(mensaje);
					break;
					
				case XmlPullParser.END_TAG:
					nodo = parser.getName();
					break;
				}

				evento = parser.nextToken();
			}
		} catch (Exception e) {
			e.printStackTrace();
			Log.e("PARSER", e.getMessage());
		}

		System.out.println(respuesta.toString());

	}

}

class Respuesta {
	protected int id;
	protected String tipo;
	protected Detalle detalle;
	protected Usuario usuario;
	protected ArrayList<Mensajes> mensajes;

}

class Detalle {
	protected int codigo;
	protected String descripcion;

}

class Usuario {
	protected String nombre;
	protected String pass;
}

class Mensajes {
	protected String emisor;
	protected String tiempo;
	protected String mensaje;

}
